from flask import Blueprint, request, jsonify, make_response, redirect
from application.models.users.user import *
from ronglian_sms_sdk import SmsSDK
user_blue = Blueprint("userblue",__name__)
import json, jwt
from tools.captcha.captcha import captcha
from tools.myredis import r
from tools.comm import sendMsg
from tools.myjwt import mjwt
import functools

# 权限认证
# def islogin(func):
# 	@functools.wraps(func)
# 	def wrapper():
# 		return func()
# 	return wrapper

def islogin(type):
    def pemistion(func):
        @functools.wraps(func)
        def wrapper():
            func()
            if type ==1:
                return redirect("http://www.baidu.com")
            else:
                return redirect("http://www.jd.com")
        return wrapper
    return pemistion

#测试
@user_blue.route("/test")
@islogin(1)
def test():
    print("执行test")
    return jsonify({"code":200,'mes':'mes'})

# 测试获取图片验证码
@user_blue.route("/getcode1")
@islogin(2)
def getcode():
    print("getcode")


# 获取图片验证码
@user_blue.route("/getcode")
def getcode():
    # 生成图片验证码 text文字， image图片流
    name, text, image = captcha.generate_captcha()
    # 从页面获取uuid做为redis key
    uuid = str(request.args.get('uuid'))
    # 存入redis
    r.str_add(uuid,str(text),60)
    # 以流的方式生成图片验证码
    res = make_response(image)
    res.headers['Content-Type'] = 'image/jpg'
    return res


import random
#发送短信验证码
@user_blue.route("/sendSmsCode", methods=['POST'])
def sendSmsCode():
    data = request.data
    if data:
        data = json.loads(data)
        #获取三个参数
        uuid = data['uuid']
        piccode = data['piccode']
        mobile = data['mobile']
        #通过uuid查询redis
        value = r.str_get(uuid)
        if value:
            # 两个验证对比，如果成功调用短信平台发短信
            if piccode.lower() == value.lower():
                #验证1分钟内只能发一次
                mcode = r.str_get(mobile)
                if mcode:
                    return jsonify({'code': 10012, 'mes': '一分钟内不能重复发送'})
                # 生成5位随机数
                scode = random.randint(10000,99999)
                # 调用短信平台
                flag = sendMsg(mobile,scode)
                if flag == True:
                    # 存入redis
                    r.str_add(mobile,scode,60)
                    # 删除图片验证码
                    r.del_str(uuid)
                    # 返回结果
                    return jsonify({'code': 200, 'mes': '发送成功'})
                else:
                    return jsonify({'code': 200, 'mes': '发送验证码失败'})
            else:
                return jsonify({'code':10011,'mes':'图片验证码错误'})
            # 失败返回错误信息
        else:
            return jsonify({'code':10010,'mes':'图片验证码不存在'})


import time
# 注册登录接口
@user_blue.route("/login", methods=['POST'])
def login():
    # 获取参数，手机号，验证码
    data = request.data
    if data:
        data = json.loads(data)
        #获取三个参数
        mcode = data['code']
        mobile = data['mobile']
        # 根据手机号去redis获取验证码
        code = r.str_get(mobile)
        if code:
            # 验证码是否相同 # 如果不相同返回错误
            if int(code)==int(mcode):
                # 如果相同查询数据库user表
                # 如果存在返回用户信息
                # 如果不存在写入用户表
                user = User.qurey.filter(User.mobile==mobile).first()
                if user:
                    # 删除redis中的验证码
                    r.del_str(mobile)
                else:
                    u = User(mobile=mobile)
                    db.session.add(u)
                    db.session.commit()
                    user = User.qurey.filter(User.mobile == mobile).first()
                # 用用户信息生成就jwt token
                token = mjwt.jwt_encode(data = {'data':{'uid':user.id,'exp':int(time.time())}})
                return jsonify({'code':200,"token":token,'userid':user.id})
                # 返回给页面
            else:
                return jsonify("code", 10021, "mes", '验证码错误')

        else:
            return jsonify("code",10020,"mes",'')
